package DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import to.Amostra;
import to.Pessoa;
import to.Propriedade;
import to.SolicitacaoDeAnalise;
import util.HibernateUtil;
import visao.ConsultaVO;

public class ConsultaDAO {

	public List<Pessoa> buscaTodos() throws Exception {
		List<Pessoa> listaRetorno = null;
		try {
			Session session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Pessoa.class);

			criteria.addOrder(Order.asc("nome"));
			listaRetorno = (List<Pessoa>) criteria.list();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return listaRetorno;
	}

	public List<Propriedade> buscarPropriedadePorPessoa(Pessoa pessoa)
			throws Exception {
		List<Propriedade> lista = null;
		try {
			Session sessao = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = sessao.createCriteria(Propriedade.class);
			criteria.add(Restrictions.eq("pessoa", pessoa));
			criteria.addOrder(Order.asc("nome"));
			lista = (List<Propriedade>) criteria.list();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return lista;
	}

	public List<Amostra> buscarAmostraPorPropriedade(Propriedade propriedade)
			throws Exception {

		List<Amostra> lista = null;

		try {

			Session session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Amostra.class);
			criteria.add(Restrictions.eq("propriedade", propriedade));
			criteria.addOrder(Order.asc("codigo"));
			lista = (List<Amostra>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return lista;
	}

	public List<SolicitacaoDeAnalise> buscarSolicitacaoPessoa(Pessoa pessoa)
			throws Exception {
		Session session = null;
		List<SolicitacaoDeAnalise> listaRetorno = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session
					.createCriteria(SolicitacaoDeAnalise.class);
			criteria.add(Restrictions.eq("pessoa", pessoa));
			criteria.addOrder(Order.desc("dataEntrada"));
			listaRetorno = (List<SolicitacaoDeAnalise>) criteria.list();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return listaRetorno;
	}

	public List<ConsultaVO> buscarAmostraPorSolicitacao(Integer solicitacao)
			throws Exception {

		StringBuilder sql = new StringBuilder();

		sql.append("select DISTINCT a.codigo, a.cultura, a.gleba, v.descricao, a.recomendacaoSolicitada, a.`Status`, d.codigo, d.descricao, t.descricao, pro.nome from amostra a ");
		sql.append("inner join vegetacao v on v.codigo = a.vegetacao_codigo ");
		sql.append("inner join solicitacaodeterminacao sd on sd.id_amostra = a.codigo ");
		sql.append("inner join solicitacaodeanalise s on s.codigo = sd.solicitacao_codigo inner join determinacao d on d.codigo = sd.id_determinacao inner join tipodeterminacao t on t.codigo = d.tipoDeterminacao_codigo inner join propriedade pro on pro.codigo = a.propriedade_codigo where s.codigo = "
				+ solicitacao);

		List<ConsultaVO> listaRetorno = new ArrayList<ConsultaVO>();

		try {

			Connection conexao = HibernateUtil.getSessionFactory()
					.openSession().connection();
			PreparedStatement comando = conexao
					.prepareStatement(sql.toString());
			ResultSet resultado = comando.executeQuery();

			while (resultado.next()) {

				ConsultaVO linha = new ConsultaVO();

				linha.setCodigoAmostra(resultado.getInt("a.codigo"));
				linha.setCultura(resultado.getObject("a.cultura"));
				linha.setGleba(resultado.getObject("a.gleba"));
				linha.setVegetacao(resultado.getObject("v.descricao"));
				linha.setRecomendacao(resultado
						.getObject("a.recomendacaoSolicitada"));
				linha.setStatus(resultado.getObject("a.status"));
				linha.setCodDeterminacao(resultado.getInt("d.codigo"));
				linha.setDeterminacao(resultado.getObject("d.descricao"));
				linha.setTipo(resultado.getObject("t.descricao"));
				linha.setPropriedade(resultado.getObject("pro.nome"));

				listaRetorno.add(linha);
			}

			conexao.close();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaRetorno;

	}

}
